home *** CD-ROM | disk | FTP | other *** search
/ InterCD 2000 September / september_2000.iso / intercd / root / ^Linux / cdrtools-1.10 / cdrecord / cdr_drv.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-05-07  |  5.9 KB  |  263 lines

  1. /* @(#)cdr_drv.c    1.20 00/05/07 Copyright 1997 J. Schilling */
  2. #ifndef lint
  3. static    char sccsid[] =
  4.     "@(#)cdr_drv.c    1.20 00/05/07 Copyright 1997 J. Schilling";
  5. #endif
  6. /*
  7.  *    CDR device abstraction layer
  8.  *
  9.  *    Copyright (c) 1997 J. Schilling
  10.  */
  11. /*
  12.  * This program is free software; you can redistribute it and/or modify
  13.  * it under the terms of the GNU General Public License as published by
  14.  * the Free Software Foundation; either version 2, or (at your option)
  15.  * any later version.
  16.  *
  17.  * This program is distributed in the hope that it will be useful,
  18.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20.  * GNU General Public License for more details.
  21.  *
  22.  * You should have received a copy of the GNU General Public License
  23.  * along with this program; see the file COPYING.  If not, write to
  24.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  25.  */
  26.  
  27. #include <stdxlib.h>
  28. #include <standard.h>
  29. #include <schily.h>
  30.  
  31. #include <scg/scsidefs.h>
  32. #include <scg/scsireg.h>
  33. #include <scg/scsitransp.h>
  34.  
  35. #include "cdrecord.h"
  36.  
  37. extern    cdr_t    cdr_oldcd;
  38. extern    cdr_t    cdr_cd;
  39. extern    cdr_t    cdr_mmc;
  40. extern    cdr_t    cdr_mmc_sony;
  41. #ifdef    DRV_DVD
  42. extern    cdr_t    cdr_dvd;
  43. #endif
  44. extern    cdr_t    cdr_philips_cdd521O;
  45. extern    cdr_t    cdr_philips_dumb;
  46. extern    cdr_t    cdr_philips_cdd521;
  47. extern    cdr_t    cdr_philips_cdd522;
  48. extern    cdr_t    cdr_kodak_pcd600;
  49. extern    cdr_t    cdr_pioneer_dw_s114x;
  50. extern    cdr_t    cdr_plasmon_rf4100;
  51. extern    cdr_t    cdr_yamaha_cdr100;
  52. extern    cdr_t    cdr_sony_cdu924;
  53. extern    cdr_t    cdr_ricoh_ro1060;
  54. extern    cdr_t    cdr_ricoh_ro1420;
  55. extern    cdr_t    cdr_teac_cdr50;
  56. extern    cdr_t    cdr_cdr_simul;
  57. extern    cdr_t    cdr_dvd_simul;
  58.  
  59. EXPORT    cdr_t     *drive_identify        __PR((SCSI *scgp, cdr_t *, struct scsi_inquiry *ip));
  60. EXPORT    int    drive_attach        __PR((SCSI *scgp, cdr_t *));
  61. EXPORT    int    attach_unknown        __PR((void));
  62. EXPORT    int    blank_dummy        __PR((SCSI *scgp, long addr, int blanktype));
  63. EXPORT    int    drive_getdisktype    __PR((SCSI *scgp, cdr_t *dp, dstat_t *dsp));
  64. EXPORT    int    cmd_ill            __PR((SCSI *scgp));
  65. EXPORT    int    cmd_dummy        __PR((SCSI *scgp));
  66. EXPORT    int    buf_dummy        __PR((SCSI *scgp, long *sp, long *fp));
  67. EXPORT    BOOL    set_cdrcmds        __PR((char *name, cdr_t **dpp));
  68. EXPORT    cdr_t    *get_cdrcmds        __PR((SCSI *scgp));
  69.  
  70. /*
  71.  * List of CD-R drivers
  72.  */
  73. cdr_t    *drivers[] = {
  74. #ifdef    DRV_DVD
  75.     &cdr_dvd,
  76. #endif
  77.     &cdr_mmc,
  78.     &cdr_mmc_sony,
  79.     &cdr_cd,
  80.     &cdr_oldcd,
  81.     &cdr_philips_cdd521O,
  82.     &cdr_philips_dumb,
  83.     &cdr_philips_cdd521,
  84.     &cdr_philips_cdd522,
  85.     &cdr_kodak_pcd600,
  86.     &cdr_pioneer_dw_s114x,
  87.     &cdr_plasmon_rf4100,
  88.     &cdr_yamaha_cdr100,
  89.     &cdr_ricoh_ro1060,
  90.     &cdr_ricoh_ro1420,
  91.     &cdr_sony_cdu924,
  92.     &cdr_teac_cdr50,
  93.     &cdr_cdr_simul,
  94.     &cdr_dvd_simul,
  95.     (cdr_t *)NULL,
  96. };
  97.  
  98. EXPORT cdr_t *
  99. drive_identify(scgp, dp, ip)
  100.     SCSI            *scgp;
  101.     cdr_t            *dp;
  102.     struct scsi_inquiry    *ip;
  103. {
  104.     return (dp);
  105. }
  106.  
  107. EXPORT int
  108. drive_attach(scgp, dp)
  109.     SCSI            *scgp;
  110.     cdr_t            *dp;
  111. {
  112.     return (0);
  113. }
  114.  
  115. EXPORT int
  116. attach_unknown()
  117. {
  118.     errmsgno(EX_BAD, "Unsupported drive type\n");
  119.     return (-1);
  120. }
  121.  
  122. EXPORT int
  123. blank_dummy(scgp, addr, blanktype)
  124.     SCSI    *scgp;
  125.     long    addr;
  126.     int    blanktype;
  127. {
  128.     printf("This drive or media does not support the BLANK command\n");
  129.     return (-1);
  130. }
  131.  
  132. EXPORT int
  133. drive_getdisktype(scgp, dp, dsp)
  134.     SCSI    *scgp;
  135.     cdr_t    *dp;
  136.     dstat_t    *dsp;
  137. {
  138.     return (0);
  139. }
  140.  
  141. EXPORT int
  142. cmd_ill(scgp)
  143.     SCSI    *scgp;
  144. {
  145.     errmsgno(EX_BAD, "Unspecified command not implemented for this drive.\n");
  146.     return (-1);
  147. }
  148.  
  149. EXPORT int
  150. cmd_dummy(scgp)
  151.     SCSI    *scgp;
  152. {
  153.     return (0);
  154. }
  155.  
  156. EXPORT int
  157. no_sendcue(scgp, tracks, trackp)
  158.     SCSI    *scgp;
  159.     int    tracks;
  160.     track_t    *trackp;
  161. {
  162.     errmsgno(EX_BAD, "SAO writing not available or not implemented for this drive.\n");
  163.     return (-1);
  164. }
  165.  
  166. EXPORT int
  167. buf_dummy(scgp, sp, fp)
  168.     SCSI    *scgp;
  169.     long    *sp;
  170.     long    *fp;
  171. {
  172.     return (-1);
  173. }
  174.  
  175. EXPORT BOOL
  176. set_cdrcmds(name, dpp)
  177.     char    *name;
  178.     cdr_t    **dpp;
  179. {
  180.     cdr_t    **d;
  181.     int    n;
  182.  
  183.     for (d = drivers; *d != (cdr_t *)NULL; d++) {
  184.         if (streql((*d)->cdr_drname, name)) {
  185.             if (dpp != NULL)
  186.                 *dpp = *d;
  187.             return (TRUE);
  188.         }
  189.     }
  190.     if (dpp == NULL)
  191.         return (FALSE);
  192.  
  193.     if (!streql("help", name))
  194.         error("Illegal driver type '%s'.\n", name);
  195.  
  196.     error("Driver types:\n");
  197.     for (d = drivers; *d != (cdr_t *)NULL; d++) {
  198.         error("%s%n",
  199.             (*d)->cdr_drname, &n);
  200.         error("%*s%s\n",
  201.             20-n, "",
  202.             (*d)->cdr_drtext);
  203.     }
  204.     if (streql("help", name))
  205.         exit(0);
  206.     exit(EX_BAD);
  207.     return (FALSE);        /* Make lint happy */
  208. }
  209.  
  210. EXPORT cdr_t *
  211. get_cdrcmds(scgp)
  212.     SCSI    *scgp;
  213. {
  214.     cdr_t    *dp = (cdr_t *)0;
  215.     BOOL    is_dvd = FALSE;
  216.  
  217.     /*
  218.      * First check for SCSI-3/mmc drives.
  219.      */
  220.     if (is_mmc(scgp, &is_dvd)) {
  221. #ifdef    DRV_DVD
  222.         if (is_dvd)
  223.             dp = &cdr_dvd;
  224.         else
  225. #endif
  226.             dp = &cdr_mmc;
  227.  
  228.     } else switch (scgp->dev) {
  229.  
  230.     case DEV_CDROM:        dp = &cdr_oldcd;        break;
  231.     case DEV_MMC_CDROM:    dp = &cdr_cd;            break;
  232.     case DEV_MMC_CDR:    dp = &cdr_mmc;            break;
  233.     case DEV_MMC_CDRW:    dp = &cdr_mmc;            break;
  234.  
  235.     case DEV_CDD_521_OLD:    dp = &cdr_philips_cdd521O;    break;
  236.     case DEV_CDD_521:    dp = &cdr_philips_cdd521;    break;
  237.     case DEV_CDD_522:
  238.     case DEV_CDD_2000:
  239.     case DEV_CDD_2600:    dp = &cdr_philips_cdd522;    break;
  240.     case DEV_PCD_600:    dp = &cdr_kodak_pcd600;        break;
  241.     case DEV_YAMAHA_CDR_100:dp = &cdr_yamaha_cdr100;    break;
  242.     case DEV_MATSUSHITA_7502:
  243.     case DEV_YAMAHA_CDR_400:dp = &cdr_mmc;            break;
  244.     case DEV_PLASMON_RF_4100:dp = &cdr_plasmon_rf4100;    break;
  245.     case DEV_SONY_CDU_924:    dp = &cdr_sony_cdu924;        break;
  246.     case DEV_RICOH_RO_1060C:dp = &cdr_ricoh_ro1060;        break;
  247.     case DEV_RICOH_RO_1420C:dp = &cdr_ricoh_ro1420;        break;
  248.     case DEV_TEAC_CD_R50S:    dp = &cdr_teac_cdr50;        break;
  249.  
  250.     case DEV_PIONEER_DW_S114X: dp = &cdr_pioneer_dw_s114x;    break;
  251. #ifdef    DRV_DVD
  252.     case DEV_PIONEER_DVDR_S101:dp = &cdr_dvd;        break;
  253. #endif
  254.  
  255.     default:        dp = &cdr_mmc;
  256.     }
  257.  
  258.     if (dp != (cdr_t *)0)
  259.         dp = dp->cdr_identify(scgp, dp, scgp->inq);
  260.  
  261.     return (dp);
  262. }
  263.